package delphorm.service.questionnaire;

import java.util.Date;
import java.util.List;

import delphorm.entite.personne.Utilisateur;
import delphorm.entite.questionnaire.InstanceQuestionnaire;
import delphorm.entite.questionnaire.Questionnaire;
import delphorm.entite.questionnaire.ValeurFichier;

/**
 * Implémentation du service questionnaire. Utilise les DAO.
 * 
 * @author jerome
 * 
 */
public class ImplQuestionnaire implements IQuestionnaire {
	delphorm.dao.questionnaire.IQuestionnaire daoQuestionnaire;

	public Questionnaire enregistrerQuestionnaire(Questionnaire questionnaire) {
		// met la date de modification à la date courante
		questionnaire.setDateModification(new Date());
		// met le questionnaire à l'état travail
		questionnaire.setEtat(new Character('W'));
		// enregistre
		questionnaire = daoQuestionnaire
				.enregistrerQuestionnaire(questionnaire);
		return questionnaire;
	}

	public Questionnaire nouveauQuestionnaire(Utilisateur u) {
		Questionnaire questionnaire = new Questionnaire();
		questionnaire.setAuteur(u);
		questionnaire.setDateCreation(new Date());
		questionnaire.setDateModification(new Date());
		questionnaire.setEtat(new Character('W'));
		return questionnaire;
	}

	/**
	 * @return daoQuestionnaire
	 */
	public delphorm.dao.questionnaire.IQuestionnaire getDaoQuestionnaire() {
		return daoQuestionnaire;
	}

	/**
	 * Setter daoQuestionnaire
	 * @param daoQuestionnaire IQuestionnaire à modifier
	 */
	public void setDaoQuestionnaire(
			delphorm.dao.questionnaire.IQuestionnaire daoQuestionnaire) {
		this.daoQuestionnaire = daoQuestionnaire;
	}

	public List<Questionnaire> listerQuestionnairesTous(String trier) {
		List<Questionnaire> questionnaires = null;
		if (IQuestionnaire.TRI_TITRE.equals(trier))
			questionnaires = daoQuestionnaire.getAllTriesParTitre();
		// TODO else exception
		return questionnaires;
	}

	public List<Questionnaire> listerQuestionnairesUtilisateur(Utilisateur utilisateur,
			String trier) {
		List<Questionnaire> questionnaires = null;
		if (trier.equals("titre"))
			questionnaires = daoQuestionnaire
					.getUtilisateursTriesParTitre(utilisateur);
		return questionnaires;
	}

	public Questionnaire getQuestionnaireParId(Long id) {
		// TODO Auto-generated method stub
		return daoQuestionnaire.getQuestionnaireParId(id);
	}

	public void supprimerQuestionnaire(Long id) {
		daoQuestionnaire.supprimerQuestionnaire(id);
	}

	public void mettreQuestionnaireEnTest(Long id) {
		Questionnaire q = daoQuestionnaire.getQuestionnaireParId(id);
		q.setEtat(new Character('T'));
		q.setDateModification(new Date());
		q.setDateTest(new Date());
		daoQuestionnaire.enregistrerQuestionnaire(q);
	}

	public void mettreQuestionnaireEnPublication(Long id) {
		Questionnaire q = daoQuestionnaire.getQuestionnaireParId(id);
		q.setEtat(new Character('P'));
		q.setDateModification(new Date());
		q.setDatePublication(new Date());
		daoQuestionnaire.enregistrerQuestionnaire(q);
	}

	public void mettreQuestionnaireEnPerime(Long id) {
		Questionnaire q = daoQuestionnaire.getQuestionnaireParId(id);
		q.setEtat(new Character('O'));
		q.setDateModification(new Date());
		q.setDatePeremption(new Date());
		daoQuestionnaire.enregistrerQuestionnaire(q);
	}

	public void mettreQuestionnaireEnTravail(Long id) {
		Questionnaire q = daoQuestionnaire.getQuestionnaireParId(id);
		q.setEtat(new Character('W'));
		q.setDateModification(new Date());
		daoQuestionnaire.enregistrerQuestionnaire(q);
	}

	public List<Questionnaire> listerQuestionnairesEnPublication() {
		return daoQuestionnaire.getQuestionnaireEnPublication();
	}

	public InstanceQuestionnaire nouveauInstanceQuestionnaire(
			Questionnaire questionnaire, Utilisateur auteur) {
		InstanceQuestionnaire iQ = new InstanceQuestionnaire();
		iQ.setAuteur(auteur);
		iQ.setDateRemplissage(new Date());
		iQ.setQuestionnaire(questionnaire);
		return iQ;
	}

	public InstanceQuestionnaire enregistrerInstanceQuestionnaire(
			InstanceQuestionnaire instanceQuestionnaire) {
		// FIXME utiliser une constante
		instanceQuestionnaire.setEtat(new Character('O'));
		return daoQuestionnaire
				.enregistrerInstanceQuestionnaire(instanceQuestionnaire);
	}

	public InstanceQuestionnaire enregistrerInstanceQuestionnairePartiel(
			InstanceQuestionnaire instanceQuestionnaire) {
		// FIXME utiliser une constante
		instanceQuestionnaire.setEtat(new Character('C'));
		return daoQuestionnaire
				.enregistrerInstanceQuestionnaire(instanceQuestionnaire);
	}

	public List<InstanceQuestionnaire> getInstancesQuestionnaireParQuestionnaireId(
			Long numeroQuestionnaire) {
		return daoQuestionnaire
				.getInstancesQuestionnaireParIdQuestionnaire(numeroQuestionnaire);
	}

	public InstanceQuestionnaire getInstanceQuestionnaireParId(
			Long numeroInstanceQuestionnaire) {
		return daoQuestionnaire
				.getInstancesQuestionnaireParId(numeroInstanceQuestionnaire);
	}


	public ValeurFichier getValeurFichier(Long idFichier) {
		//FIXME modifier le paramètre du DAO
		return daoQuestionnaire.getValeurFichier(idFichier.intValue());
	}

	public List<InstanceQuestionnaire> getInstancesQuestionnaireEnCoursParUtilisateur(
			Utilisateur utilisateur) {
		return daoQuestionnaire
				.getInstancesQuestionnaireEnCoursParUtilisateur(utilisateur);
	}

}
